!(function (t, e) {
	'object' == typeof exports && 'undefined' != typeof module
		? e(exports)
		: 'function' == typeof define && define.amd
		? define(['exports'], e)
		: e(
				((t =
					'undefined' != typeof globalThis
						? globalThis
						: t || self).Signature = {})
		  )
})(this, function (t) {
	'use strict'
	function e(t, e) {
		var i = Object.keys(t)
		if (Object.getOwnPropertySymbols) {
			var n = Object.getOwnPropertySymbols(t)
			e &&
				(n = n.filter(function (e) {
					return Object.getOwnPropertyDescriptor(t, e).enumerable
				})),
				i.push.apply(i, n)
		}
		return i
	}
	function i(t) {
		for (var i = 1; arguments.length > i; i++) {
			var n = null != arguments[i] ? arguments[i] : {}
			i % 2
				? e(Object(n), !0).forEach(function (e) {
						a(t, e, n[e])
				  })
				: Object.getOwnPropertyDescriptors
				? Object.defineProperties(
						t,
						Object.getOwnPropertyDescriptors(n)
				  )
				: e(Object(n)).forEach(function (e) {
						Object.defineProperty(
							t,
							e,
							Object.getOwnPropertyDescriptor(n, e)
						)
				  })
		}
		return t
	}
	function n(t) {
		return (
			(n =
				'function' == typeof Symbol &&
				'symbol' == typeof Symbol.iterator
					? function (t) {
							return typeof t
					  }
					: function (t) {
							return t &&
								'function' == typeof Symbol &&
								t.constructor === Symbol &&
								t !== Symbol.prototype
								? 'symbol'
								: typeof t
					  }),
			n(t)
		)
	}
	function o(t, e) {
		if (!(t instanceof e))
			throw new TypeError('Cannot call a class as a function')
	}
	function r(t, e) {
		for (var i = 0; e.length > i; i++) {
			var n = e[i]
			;(n.enumerable = n.enumerable || !1),
				(n.configurable = !0),
				'value' in n && (n.writable = !0),
				Object.defineProperty(t, n.key, n)
		}
	}
	function s(t, e, i) {
		return (
			e && r(t.prototype, e),
			i && r(t, i),
			Object.defineProperty(t, 'prototype', { writable: !1 }),
			t
		)
	}
	function a(t, e, i) {
		return (
			e in t
				? Object.defineProperty(t, e, {
						value: i,
						enumerable: !0,
						configurable: !0,
						writable: !0,
				  })
				: (t[e] = i),
			t
		)
	}
	function u(t, e) {
		if ('function' != typeof e && null !== e)
			throw new TypeError(
				'Super expression must either be null or a function'
			)
		;(t.prototype = Object.create(e && e.prototype, {
			constructor: { value: t, writable: !0, configurable: !0 },
		})),
			Object.defineProperty(t, 'prototype', { writable: !1 }),
			e && h(t, e)
	}
	function c(t) {
		return (
			(c = Object.setPrototypeOf
				? Object.getPrototypeOf
				: function (t) {
						return t.__proto__ || Object.getPrototypeOf(t)
				  }),
			c(t)
		)
	}
	function h(t, e) {
		return (
			(h =
				Object.setPrototypeOf ||
				function (t, e) {
					return (t.__proto__ = e), t
				}),
			h(t, e)
		)
	}
	function l(t, e) {
		if (e && ('object' == typeof e || 'function' == typeof e)) return e
		if (void 0 !== e)
			throw new TypeError(
				'Derived constructors may only return object or undefined'
			)
		return (function (t) {
			if (void 0 === t)
				throw new ReferenceError(
					"this hasn't been initialised - super() hasn't been called"
				)
			return t
		})(t)
	}
	function v(t) {
		var e = (function () {
			if ('undefined' == typeof Reflect || !Reflect.construct) return !1
			if (Reflect.construct.sham) return !1
			if ('function' == typeof Proxy) return !0
			try {
				return (
					Boolean.prototype.valueOf.call(
						Reflect.construct(Boolean, [], function () {})
					),
					!0
				)
			} catch (t) {
				return !1
			}
		})()
		return function () {
			var i,
				n = c(t)
			if (e) {
				var o = c(this).constructor
				i = Reflect.construct(n, arguments, o)
			} else i = n.apply(this, arguments)
			return l(this, i)
		}
	}
	var f = {}.toString,
		d = function (t, e) {
			return f.call(t) === '[object ' + e + ']'
		},
		y = function (t) {
			return d(t, 'String')
		},
		p = function (t) {
			return d(t, 'Number')
		},
		g = (function () {
			function t() {
				o(this, t), (this.__events = void 0), (this.__events = {})
			}
			return (
				s(t, [
					{
						key: 'on',
						value: function (t, e) {
							if (t && e) {
								var i = this.__events[t] || []
								i.push(e), (this.__events[t] = i)
							}
						},
					},
					{
						key: 'emit',
						value: function (t, e) {
							var i = this
							if (
								((function (t) {
									var e = n(t)
									return (
										(null !== t && 'object' === e) ||
										'function' === e
									)
								})(t) && (t = (e = t) && e.type),
								t)
							) {
								var o = this.__events[t]
								o &&
									o.length &&
									o.forEach(function (t) {
										t.call(i, e)
									})
							}
						},
					},
					{
						key: 'off',
						value: function (t, e) {
							var i = this.__events,
								n = i[t]
							if (n && n.length)
								if (e)
									for (var o = 0, r = n.length; r > o; o++)
										n[o] === e && (n.splice(o, 1), o--)
								else delete i[t]
						},
					},
					{
						key: 'getEvents',
						value: function () {
							return this.__events
						},
					},
				]),
				t
			)
		})(),
		m = (function (t) {
			u(i, t)
			var e = v(i)
			function i(t, n) {
				var r
				return (
					o(this, i),
					((r = e.call(this)).context = void 0),
					(r.canvas = void 0),
					(r.attrs = void 0),
					(r.isCanvasElement = void 0),
					(r.context = t),
					(r.canvas = n.canvas ||
						t.canvas || {
							width: n.width || 0,
							height: n.height || 0,
						}),
					(r.attrs = n || {}),
					(r.isCanvasElement = !0),
					r
				)
			}
			return (
				s(i, [
					{
						key: 'width',
						get: function () {
							return this.canvas.width
						},
						set: function (t) {
							this.canvas.width = t
						},
					},
					{
						key: 'height',
						get: function () {
							return this.canvas.height
						},
						set: function (t) {
							this.canvas.height = t
						},
					},
					{
						key: 'getContext',
						value: function () {
							return this.context
						},
					},
					{
						key: 'getBoundingClientRect',
						value: function () {
							var t = this.attrs || {},
								e = t.top,
								i = t.right,
								n = t.width,
								o = t.height,
								r = t.left,
								s = t.bottom
							return {
								top: void 0 === e ? 0 : e,
								width: void 0 === n ? 0 : n,
								right: void 0 === i ? 0 : i,
								height: void 0 === o ? 0 : o,
								bottom: void 0 === s ? 0 : s,
								left: void 0 === r ? 0 : r,
							}
						},
					},
					{
						key: 'setAttribute',
						value: function (t, e) {
							this.attrs[t] = e
						},
					},
					{
						key: 'addEventListener',
						value: function (t, e) {
							this.on(t, e)
						},
					},
					{
						key: 'removeEventListener',
						value: function (t, e) {
							this.off(t, e)
						},
					},
					{
						key: 'dispatchEvent',
						value: function (t, e) {
							this.emit(t, e)
						},
					},
				]),
				i
			)
		})(g)
	var x = function (t, e) {
		return t
			? (function (t) {
					if (!t) return !1
					if (
						1 !== t.nodeType ||
						!t.nodeName ||
						'canvas' !== t.nodeName.toLowerCase()
					)
						return !1
					var e = !1
					try {
						t.addEventListener('eventTest', function () {
							e = !0
						}),
							t.dispatchEvent(new Event('eventTest'))
					} catch (t) {
						e = !1
					}
					return e
			  })(t.canvas)
				? t.canvas
				: new m(t, e)
			: null
	}
	function w(t, e) {
		try {
			return t.currentStyle
				? t.currentStyle[e]
				: document.defaultView &&
						document.defaultView
							.getComputedStyle(t, null)
							.getPropertyValue(e)
		} catch (t) {
			return { width: 300, height: 150 }[e]
		}
	}
	function b(t, e) {
		var i = e.get('el')
		if (!i) return t
		var n = i.getBoundingClientRect(),
			o = n.top,
			r = void 0 === o ? 0 : o,
			s = n.left,
			a = void 0 === s ? 0 : s,
			u = parseFloat(w(i, 'padding-left')) || 0,
			c = parseFloat(w(i, 'padding-top')) || 0
		return { x: t.x - a - u, y: t.y - r - c }
	}
	function k(t, e) {
		var i = e.get('landscape')
		if (!i) return t
		if (d(i, 'Function')) return i(t, e)
		var n = e.get('height')
		return { x: t.y, y: n - t.x }
	}
	var _ = function (t, e) {
			var i = t.touches
			if (!i || !i.length)
				return [k(b({ x: t.clientX, y: t.clientY }, e), e)]
			i.length || (i = t.changedTouches || [])
			for (var n = [], o = 0, r = i.length; r > o; o++) {
				var s = i[o],
					a = s.x,
					u = s.y,
					c = s.clientX,
					h = s.clientY,
					l = void 0
				;(l = p(a) || p(u) ? { x: a, y: u } : b({ x: c, y: h }, e)),
					n.push(k(l, e))
			}
			return n
		},
		E = function (t, e) {
			var i = e.x - t.x,
				n = e.y - t.y
			return Math.abs(i) > Math.abs(n)
				? i > 0
					? 'right'
					: 'left'
				: n > 0
				? 'down'
				: 'up'
		},
		P = function (t, e) {
			var i = Math.abs(e.x - t.x),
				n = Math.abs(e.y - t.y)
			return Math.sqrt(i * i + n * n)
		},
		L = (function () {
			function t(e) {
				var i = this,
					n = e.canvas,
					r = e.el
				o(this, t),
					(this.processEvent = void 0),
					(this.canvas = void 0),
					(this.startTime = 0),
					(this.endTime = 0),
					(this.startPoints = null),
					(this.startDistance = 0),
					(this.center = null),
					(this.pressTimeout = void 0),
					(this.eventType = null),
					(this.direction = null),
					(this.lastMoveTime = 0),
					(this.prevMovePoints = null),
					(this.prevMoveTime = 0),
					(this.lastMovePoints = null),
					(this.pinch = !1),
					(this._click = function (t) {
						var e = _(t, i.canvas)
						;(t.points = e), i.emitEvent('click', t)
					}),
					(this._start = function (t) {
						var e,
							n,
							o = _(t, i.canvas)
						o &&
							((t.points = o),
							i.emitEvent('touchstart', t),
							i.reset(),
							(i.startTime = Date.now()),
							(i.startPoints = o),
							o.length > 1
								? ((i.startDistance = P(o[0], o[1])),
								  (i.center = {
										x:
											(e = o[0]).x +
											((n = o[1]).x - e.x) / 2,
										y: e.y + (n.y - e.y) / 2,
								  }))
								: (i.pressTimeout = setTimeout(function () {
										var e = 'press',
											n = 'none'
										;(t.direction = n),
											i.emitStart(e, t),
											i.emitEvent(e, t),
											(i.eventType = e),
											(i.direction = n)
								  }, 250)))
					}),
					(this._move = function (t) {
						var e = _(t, i.canvas)
						if (e) {
							;(t.points = e), i.emitEvent('touchmove', t)
							var n = i.startPoints
							if (n)
								if (e.length > 1) {
									var o = i.startDistance,
										r = P(e[0], e[1])
									;(t.zoom = r / o),
										(t.center = i.center),
										i.emitStart('pinch', t),
										i.emitEvent('pinch', t)
								} else {
									var s = e[0].x - n[0].x,
										a = e[0].y - n[0].y,
										u = i.direction || E(n[0], e[0])
									i.direction = u
									var c = i.getEventType(e)
									;(t.direction = u),
										(t.deltaX = s),
										(t.deltaY = a),
										i.emitStart(c, t),
										i.emitEvent(c, t)
									var h = i.lastMoveTime,
										l = Date.now()
									l - h > 0 &&
										((i.prevMoveTime = h),
										(i.prevMovePoints = i.lastMovePoints),
										(i.lastMoveTime = l),
										(i.lastMovePoints = e))
								}
						}
					}),
					(this._end = function (t) {
						var e = _(t, i.canvas)
						;(t.points = e),
							i.emitEnd(t),
							i.emitEvent('touchend', t)
						var n = i.lastMoveTime
						if (100 > Date.now() - n) {
							var o = n - (i.prevMoveTime || i.startTime)
							if (o > 0) {
								var r = i.prevMovePoints || i.startPoints,
									s = i.lastMovePoints
								if (!r || !s) return
								var a = P(r[0], s[0]) / o
								a > 0.3 &&
									((t.velocity = a),
									(t.direction = E(r[0], s[0])),
									i.emitEvent('swipe', t))
							}
						}
						i.reset()
						var u = t.touches
						u && u.length > 0 && i._start(t)
					}),
					(this._cancel = function (t) {
						i.emitEvent('touchcancel', t), i.reset()
					}),
					(this.canvas = n),
					this.delegateEvent(r),
					(this.processEvent = {})
			}
			return (
				s(t, [
					{
						key: 'delegateEvent',
						value: function (t) {
							t.addEventListener('click', this._click),
								t.addEventListener('touchstart', this._start),
								t.addEventListener('touchmove', this._move),
								t.addEventListener('touchend', this._end),
								t.addEventListener('touchcancel', this._cancel)
						},
					},
					{
						key: 'emitEvent',
						value: function (t, e) {
							this.canvas.emit(t, e)
						},
					},
					{
						key: 'getEventType',
						value: function (t) {
							var e,
								i = this.eventType,
								n = this.startTime,
								o = this.startPoints
							if (i) return i
							var r = this.canvas.__events.pan
							if (r && r.length) {
								var s = Date.now()
								if (!o) return
								e =
									s - n > 250 && 10 > P(o[0], t[0])
										? 'press'
										: 'pan'
							} else e = 'press'
							return (this.eventType = e), e
						},
					},
					{
						key: 'enable',
						value: function (t) {
							this.processEvent[t] = !0
						},
					},
					{
						key: 'isProcess',
						value: function (t) {
							return this.processEvent[t]
						},
					},
					{
						key: 'emitStart',
						value: function (t, e) {
							this.isProcess(t) ||
								(this.enable(t),
								this.emitEvent(''.concat(t, 'start'), e))
						},
					},
					{ key: 'emitEnd', value: function (t) {} },
					{
						key: 'clearPressTimeout',
						value: function () {
							this.pressTimeout &&
								(clearTimeout(this.pressTimeout),
								(this.pressTimeout = null))
						},
					},
					{
						key: 'reset',
						value: function () {
							this.clearPressTimeout(),
								(this.startTime = 0),
								(this.startPoints = null),
								(this.startDistance = 0),
								(this.direction = null),
								(this.eventType = null),
								(this.pinch = !1),
								(this.prevMoveTime = 0),
								(this.prevMovePoints = null),
								(this.lastMoveTime = 0),
								(this.lastMovePoints = null)
						},
					},
				]),
				t
			)
		})(),
		T = (function (t) {
			u(i, t)
			var e = v(i)
			function i(t) {
				var n
				o(this, i),
					((n = e.call(this))._attrs = {}),
					(n._isWindow = void 0),
					(n._attrs = Object.assign({}, t)),
					(n._isWindow = 'undefined' != typeof window),
					n._initPixelRatio(),
					n._initCanvas()
				return (
					[
						'createImage',
						'toDataURL',
						'requestAnimationFrame',
					].forEach(function (e) {
						n._initAttrs(e, t.canvas || n.get('el'))
					}),
					n
				)
			}
			return (
				s(i, [
					{
						key: 'get',
						value: function (t) {
							return this._attrs[t]
						},
					},
					{
						key: 'set',
						value: function (t, e) {
							this._attrs[t] = e
						},
					},
					{
						key: '_initAttrs',
						value: function (t, e) {
							var i = this
							if (!this.get(t)) {
								this.set(t, function () {
									return e[t]
										? e[t].apply(e, arguments)
										: i._isWindow
										? window[t]
											? (n = window)[t].apply(
													n,
													arguments
											  )
											: 'createImage' == t
											? new Image()
											: null
										: void 0
									var n
								})
							}
						},
					},
					{
						key: '_initCanvas',
						value: function () {
							var t,
								e,
								i = this.get('el'),
								n = this.get('context')
							if (!i && !n)
								throw Error('请指定 id、el 或 context!')
							;(t = i
								? y(i)
									? (e = i)
										? document.getElementById(e)
										: null
									: i
								: x(n, this._attrs)),
								n &&
									t &&
									!t.getContext &&
									(t.getContext = function () {
										return n
									})
							var o =
									this.get('width') ||
									(function (t) {
										var e = w(t, 'width')
										return (
											'auto' === e && (e = t.offsetWidth),
											parseFloat(e)
										)
									})(t) ||
									t.width,
								r =
									this.get('height') ||
									(function (t) {
										var e = w(t, 'height')
										return (
											'auto' === e &&
												(e = t.offsetHeight),
											parseFloat(e)
										)
									})(t) ||
									t.height
							this.set('canvas', this),
								this.set('el', t),
								this.set('context', n || t.getContext('2d')),
								this.changeSize(o, r)
							var s = new L({
								canvas: this,
								el: t,
								parent: this.get('parent'),
							})
							this.set('eventController', s)
						},
					},
					{
						key: '_initPixelRatio',
						value: function () {
							this.get('pixelRatio') ||
								this.set(
									'pixelRatio',
									(window && window.devicePixelRatio) || 1
								)
						},
					},
					{
						key: 'changeSize',
						value: function (t, e) {
							var i,
								o = this.get('pixelRatio'),
								r = this.get('el')
							;(r.style &&
								((r.style.width = t + 'px'),
								(r.style.height = e + 'px')),
							(i = r) &&
								'object' === n(i) &&
								((1 === i.nodeType && i.nodeName) ||
									i.isCanvasElement)) &&
								((r.width = t * o),
								(r.height = e * o),
								1 !== o && this.get('context').scale(o, o))
							this.set('width', t), this.set('height', e)
						},
					},
					{
						key: 'destroy',
						value: function () {
							if (!this.get('destroyed')) {
								var t = this.get('el')
								;(t.width = 0),
									(t.height = 0),
									this.clear(),
									(this._attrs = {}),
									this.set('destroyed', !0)
							}
						},
					},
					{ key: 'clear', value: function () {} },
					{
						key: 'isDestroyed',
						value: function () {
							return this.get('destroyed')
						},
					},
				]),
				i
			)
		})(g)
	var M = {
			penColor: 'black',
			backgroundColor: '',
			openSmooth: !0,
			penSize: 2,
			minLineWidth: 2,
			maxLineWidth: 6,
			minSpeed: 1.5,
			maxWidthDiffRate: 20,
			maxHistoryLength: 20,
		},
		S = (function () {
			function t(e) {
				var i = this
				o(this, t),
					(this.canAddHistory = !0),
					(this.points = []),
					(this.historyList = []),
					(this.canvas = void 0),
					(this._isEmpty = !0),
					(this.active = !1),
					(this.getLineWidth = function (t) {
						var e = i.get('options'),
							n = e.minSpeed,
							o = e.minLineWidth,
							r = i.getMaxLineWidth()
						return Math.min(
							Math.max(
								r -
									((r - o) * t) /
										Math.max(Math.min(n, 10), 1),
								o
							),
							r
						)
					}),
					(this.drawTrapezoid = function (t, e, n, o) {
						var r = i.get('context')
						r.beginPath(),
							r.moveTo(
								Number(t.x.toFixed(1)),
								Number(t.y.toFixed(1))
							),
							r.lineTo(
								Number(e.x.toFixed(1)),
								Number(e.y.toFixed(1))
							),
							r.lineTo(
								Number(n.x.toFixed(1)),
								Number(n.y.toFixed(1))
							),
							r.lineTo(
								Number(o.x.toFixed(1)),
								Number(o.y.toFixed(1))
							),
							(r.fillStyle = i.get('options').penColor),
							r.fill(),
							r.draw && r.draw(!0)
					}),
					(this.drawNoSmoothLine = function (t, e) {
						;(e.lastX = t.x + 0.5 * (e.x - t.x)),
							(e.lastY = t.y + 0.5 * (e.y - t.y)),
							'number' == typeof t.lastX &&
								i.drawCurveLine(
									t.lastX,
									t.lastY,
									t.x,
									t.y,
									e.lastX,
									e.lastY,
									i.getMaxLineWidth()
								)
					}),
					(this.drawCurveLine = function (t, e, n, o, r, s, a) {
						a = Number(a.toFixed(1))
						var u = i.get('context')
						;(u.lineWidth = a),
							u.beginPath(),
							u.moveTo(
								Number(t.toFixed(1)),
								Number(e.toFixed(1))
							),
							u.quadraticCurveTo(
								Number(n.toFixed(1)),
								Number(o.toFixed(1)),
								Number(r.toFixed(1)),
								Number(s.toFixed(1))
							),
							u.stroke(),
							u.draw && u.draw(!0)
					}),
					(this.getRadianData = function (t, e, i, n) {
						var o = i - t,
							r = n - e
						if (0 === o) return { val: 0, pos: -1 }
						if (0 === r) return { val: 0, pos: 1 }
						var s = Math.abs(Math.atan(r / o))
						return (i > t && e > n) || (t > i && n > e)
							? { val: s, pos: 1 }
							: { val: s, pos: -1 }
					}),
					(this.getRadianPoints = function (t, e, i, n) {
						if (0 === t.val)
							return 1 === t.pos
								? [
										{ x: e, y: i + n },
										{ x: e, y: i - n },
								  ]
								: [
										{ y: i, x: e + n },
										{ y: i, x: e - n },
								  ]
						var o = Math.sin(t.val) * n,
							r = Math.cos(t.val) * n
						return 1 === t.pos
							? [
									{ x: e + o, y: i + r },
									{ x: e - o, y: i - r },
							  ]
							: [
									{ x: e + o, y: i - r },
									{ x: e - o, y: i + r },
							  ]
					}),
					(this.drawSmoothLine = function (t, e) {
						var n = e.x - t.x,
							o = e.y - t.y
						if (
							(Math.abs(n) + Math.abs(o) > 2
								? ((e.lastX1 = t.x + 0.3 * n),
								  (e.lastY1 = t.y + 0.3 * o),
								  (e.lastX2 = t.x + 0.7 * n),
								  (e.lastY2 = t.y + 0.7 * o))
								: ((e.lastX1 = e.lastX2 = t.x + 0.5 * n),
								  (e.lastY1 = e.lastY2 = t.y + 0.5 * o)),
							(e.perLineWidth = (t.lineWidth + e.lineWidth) / 2),
							'number' == typeof t.lastX1)
						) {
							if (
								(i.drawCurveLine(
									t.lastX2,
									t.lastY2,
									t.x,
									t.y,
									e.lastX1,
									e.lastY1,
									e.perLineWidth
								),
								t.isFirstPoint)
							)
								return
							if (t.lastX1 === t.lastX2 && t.lastY1 === t.lastY2)
								return
							var r = i.getRadianData(
									t.lastX1,
									t.lastY1,
									t.lastX2,
									t.lastY2
								),
								s = i.getRadianPoints(
									r,
									t.lastX1,
									t.lastY1,
									t.perLineWidth / 2
								),
								a = i.getRadianPoints(
									r,
									t.lastX2,
									t.lastY2,
									e.perLineWidth / 2
								)
							i.drawTrapezoid(s[0], a[0], a[1], s[1])
						} else e.isFirstPoint = !0
					}),
					(this.addHistory = function () {
						var t = i.get('options').maxHistoryLength
						if (t && i.canAddHistory)
							if (
								((i.canAddHistory = !1), i.get('createImage'))
							) {
								var e = null
								e = i.get('createImage')()
								var n =
									i.get('toDataURL') && i.get('toDataURL')()
								y(n)
									? (e.src = n)
									: n.then(function (t) {
											e.src = t
									  }),
									(e.onload = function () {
										i.historyList.push(e),
											(i.historyList =
												i.historyList.slice(-t))
									})
							} else i.historyList.length++
					}),
					(this.drawByImage = function (t) {
						var e = i.get('context'),
							n = i.get('width'),
							o = i.get('height')
						e.clearRect(0, 0, n, o)
						try {
							e.drawImage(t, 0, 0, n, o), e.draw && e.draw(!0)
						} catch (t) {
							i.historyList.length = 0
						}
					}),
					(this.isEmpty = function () {
						return i.get('options').maxHistoryLength > 0
							? 0 === i.historyList.length
							: i._isEmpty
					}),
					(this.clear = function () {
						var t = i.get('context')
						t.clearRect(0, 0, i.get('width'), i.get('height')),
							t.draw && t.draw(),
							(i._isEmpty = !0),
							(i.historyList.length = 0)
					}),
					(this.undo = function () {
						if (
							(0 === i.get('options').maxHistoryLength &&
								i.clear(),
							i.get('createImage') && i.historyList.length)
						) {
							var t = i.historyList.splice(-1)[0]
							i.drawByImage(t),
								0 === i.historyList.length && i.clear()
						}
					}),
					(this.canvas = e),
					this.canvas.set('pen', M),
					this.init()
			}
			return (
				s(t, [
					{ key: 'getOption', value: function () {} },
					{
						key: 'setOption',
						value: function () {
							var t =
									arguments.length > 0 &&
									void 0 !== arguments[0]
										? arguments[0]
										: {},
								e = i({}, t),
								n = e.maxLineWidth
							if (n && t.penSize && n == M.maxLineWidth) {
								var o = Math.max(n, t.penSize)
								e.maxLineWidth = o
							}
							this.canvas.set('pen', Object.assign({}, M, e))
						},
					},
					{
						key: 'get',
						value: function (t) {
							return this.canvas.get('options' == t ? 'pen' : t)
						},
					},
					{
						key: 'init',
						value: function () {
							var t = this
							;(this.get('context').lineCap = 'round'),
								this.canvas.on('touchstart', function (e) {
									return t.onDrawStart(e)
								}),
								this.canvas.on('touchmove', function (e) {
									return t.onDrawMove(e)
								}),
								this.canvas.on('touchend', function (e) {
									return t.onDrawEnd(e)
								})
						},
					},
					{
						key: 'drawBackground',
						value: function () {
							var t = this.get('context'),
								e = this.get('width'),
								i = this.get('height'),
								n = this.get('options'),
								o = n.backgroundColor,
								r = n.backgroundImage
							o &&
								((t.fillStyle = o),
								t.fillRect(0, 0, e, i),
								t.draw && t.draw(!0)),
								r && this.drawByImage(r)
						},
					},
					{
						key: 'remove',
						value: function () {
							var t = this
							this.canvas.off('touchstart', function (e) {
								return t.onDrawStart(e)
							}),
								this.canvas.off('touchmove', function (e) {
									return t.onDrawMove(e)
								}),
								this.canvas.off('touchend', function (e) {
									return t.onDrawEnd(e)
								})
						},
					},
					{
						key: 'disableScroll',
						value: function (t) {
							t.preventDefault &&
								this.get('options').disableScroll &&
								t.preventDefault()
						},
					},
					{
						key: 'onDrawStart',
						value: function (t) {
							this.disableScroll(t)
							var e = t.points
							if (this.active) {
								;(this.canAddHistory = !0),
									(this.get('context').strokeStyle =
										this.get('options').penColor)
								var i = e[0]
								this.initPoint(i.x, i.y)
							}
						},
					},
					{
						key: 'onDrawMove',
						value: function (t) {
							if ((this.disableScroll(t), this.active)) {
								var e = t.points[0]
								this.initPoint(e.x, e.y), this.onDraw()
							}
						},
					},
					{
						key: 'onDrawEnd',
						value: function (t) {
							this.active &&
								((this.canAddHistory = !0), (this.points = []))
						},
					},
					{
						key: 'onDraw',
						value: function () {
							var t = this,
								e = this.get('context')
							if (this.points.length >= 2) {
								this.addHistory(),
									(e.lineWidth =
										this.get('options').penSize || 2)
								var i = this.points.slice(-1)[0],
									n = this.points.slice(-2, -1)[0],
									o = function () {
										;(t._isEmpty = !1),
											t.get('options').openSmooth
												? t.drawSmoothLine(n, i)
												: t.drawNoSmoothLine(n, i)
									}
								'function' ==
								typeof this.get('el').requestAnimationFrame
									? this.get('el').requestAnimationFrame(
											function () {
												return o()
											}
									  )
									: o()
							}
						},
					},
					{
						key: 'getMaxLineWidth',
						value: function () {
							var t = this.get('options')
							return Math.min(t.penSize, t.maxLineWidth)
						},
					},
					{
						key: 'initPoint',
						value: function (t, e) {
							var i = { x: t, y: e, t: Date.now() },
								n = this.points.slice(-1)[0]
							if (
								!n ||
								(n.t !== i.t && (n.x !== t || n.y !== e))
							) {
								if (this.get('options').openSmooth && n) {
									var o = this.points.slice(-2, -1)[0]
									if (
										((i.distance = Math.sqrt(
											Math.pow(i.x - n.x, 2) +
												Math.pow(i.y - n.y, 2)
										)),
										(i.speed =
											i.distance / (i.t - n.t || 0.1)),
										(i.lineWidth = this.getLineWidth(
											i.speed
										)),
										o && o.lineWidth && n.lineWidth)
									) {
										var r =
												(i.lineWidth - n.lineWidth) /
												n.lineWidth,
											s =
												this.get('options')
													.maxWidthDiffRate / 100
										if (
											((s =
												s > 1
													? 1
													: 0.01 > s
													? 0.01
													: s),
											Math.abs(r) > s)
										)
											i.lineWidth =
												n.lineWidth *
												(1 + (r > 0 ? s : -s))
									}
								}
								this.points.push(i),
									(this.points = this.points.slice(-3))
							}
						},
					},
				]),
				t
			)
		})(),
		O = (function () {
			function t(e) {
				o(this, t),
					(this.canvas = void 0),
					(this._ee = void 0),
					(this.pen = void 0)
				var i = new T(e)
				i.set('parent', this),
					(this.canvas = i),
					(this._ee = new g()),
					(this.pen = new S(i)),
					this.init()
			}
			return (
				s(t, [
					{
						key: 'init',
						value: function () {
							this.pen.active = !0
						},
					},
					{
						key: 'destroy',
						value: function () {
							this.canvas.destroy()
						},
					},
					{
						key: 'clear',
						value: function () {
							this.pen.clear()
						},
					},
					{
						key: 'undo',
						value: function () {
							this.pen.undo()
						},
					},
					{ key: 'save', value: function () {} },
					{
						key: 'isEmpty',
						value: function () {
							return this.pen.isEmpty()
						},
					},
					{
						key: 'on',
						value: function (t, e) {
							this._ee.on(t, e)
						},
					},
					{
						key: 'emit',
						value: function (t, e) {
							this._ee.emit(t, e)
						},
					},
					{
						key: 'off',
						value: function (t, e) {
							this._ee.off(t, e)
						},
					},
				]),
				t
			)
		})()
	;(t.Signature = O),
		(t.default = O),
		Object.defineProperty(t, '__esModule', { value: !0 })
})
